package com.ruoyi.ade.llm.utils;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

/**
 * 根据 给定的字符串text生成唯一ID
 * 确保：  text相同生成ID相同    text不同生成的ID不同
 */
public class UIDUtils {

        // 定义命名空间UUID（可自定义）
        private static final UUID NAMESPACE = UUID.fromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8");

        public static UUID generateUUID(String input) {
            if (input == null) {
                input = "";
            }
            // 使用 UUID.nameUUIDFromBytes 方法，基于输入字符串的 MD5 哈希生成 UUID
            // 这确保了相同的输入字符串总是生成相同的 UUID
            // 不同的输入字符串生成不同的 UUID（概率极高）
            return UUID.nameUUIDFromBytes(input.getBytes());
        }


        public static UUID generateUUIDv5(String text) {
            try {
                // 使用SHA-1哈希算法
                MessageDigest sha1 = MessageDigest.getInstance("SHA-1");

                // 组合命名空间和文本
                ByteBuffer buffer = ByteBuffer.allocate(16 + text.length());
                buffer.putLong(NAMESPACE.getMostSignificantBits());
                buffer.putLong(NAMESPACE.getLeastSignificantBits());
                buffer.put(text.getBytes(StandardCharsets.UTF_8));
                byte[] hash = sha1.digest(buffer.array());

                // 调整字节格式为UUIDv5
                hash[6]  &= 0x0f;  // 清除版本位
                hash[6]  |= 0x50;  // 设置版本为5
                hash[8]  &= 0x3f;  // 清除变体位
                hash[8]  |= 0x80;  // 设置变体为RFC 4122

                ByteBuffer bb = ByteBuffer.wrap(hash, 0, 16);
                return new UUID(bb.getLong(), bb.getLong());
            } catch (NoSuchAlgorithmException e) {
                throw new RuntimeException("SHA-1 algorithm not found", e);
            }
        }

        public static void main(String[] args) {
            String text1 = "你好";
            String text2 = "world";

            UUID uuid1 = generateUUID(text1);
            UUID uuid2 = generateUUID(text2);

            System.out.println("Text: " + text1 + " => UUID: " + uuid1);
            System.out.println("Text: " + text2 + " => UUID: " + uuid2);
        }
}
